#ifndef _CentroJyP_CentroJyP_h
#define _CentroJyP_CentroJyP_h

#include <CtrlLib/CtrlLib.h>
#include <SqlCtrl/SqlCtrl.h>
#include <PostgreSQL/PostgreSQL.h>
#include <GridCtrl/GridCtrl.h>
#include <RichEdit/RichEdit.h>
#include <HelpViewer/HelpViewer.h>
#include <Report/Report.h>
#include <PdfDraw/PdfDraw.h>
#include <windows.h>

using namespace Upp;

#define LAYOUTFILE <CentroJyP/CentroJyP.lay>
#include <CtrlCore/lay.h>

#define IMAGECLASS CentroJyPImg
#define IMAGEFILE <CentroJyP/CentroJyP.iml>
#include <Draw/iml_header.h>

#define SCHEMADIALECT <PostgreSQL/PostgreSQLSchema.h>
#define MODEL <CentroJyP/CentroJyPDB.sch>
#include "Sql/sch_header.h"

#define TOPICFILE <CentroJyP/app.tpp/all.i>
#include <Core/topic_group.h>

#include "EditorFormularioSolicitud.h"

class EditorCarnet : public TopWindow {
	typedef EditorCarnet CLASSNAME;
	
public:
	EditorCarnet();
};

/**
 Ventana Principal del sistema.
*/
class BienvenidaDlg : public WithInitWindowsLayout<TopWindow> {
	typedef BienvenidaDlg CLASSNAME;
	
	String back_path;

	void InitMainWindows();
	void ListarAfiliadosAdherentes();
	void ListarAfiliadosPotenciales();
	void ImportarArchivo();
	void leerArchivo(String archivo);
	void analizarArchivo(String linea);
	void compararDatos();
	void ExportarAltas();
	void ExportarBajas();
	void HacerBackUp();
	void RestaurarBackUp();
	void Salir();

//	void ChooseOutput();
//	void EnableBackupBtn();
//	void ExecCreateBackup();

public:
	BienvenidaDlg();
	
	bool OpenConnection(String host,String dbname,String user,String pass, String port);
};

//==============================================================================================

/**
 Ventana que muestra los afiliados que se han dado de baja desde Córdoba.
*/
class BajasAutomaticasDlg : public WithBajasAutomaticasLayout<TopWindow> {
	typedef BajasAutomaticasDlg CLASSNAME;

	void elimarAfiliadosAutom();
	void cancelarEliminacion();

public:
	BajasAutomaticasDlg();
};

//==============================================================================================

/**
 Ventana que muestra el listado de afiliados.
*/
class ListadoAfiliadosDlg : public WithListadoAfiliadosActivosLayout<TopWindow> {
	typedef ListadoAfiliadosDlg CLASSNAME;
	
	MenuBar menu;
	ToolBar tool;
	StatusBar status;
	
	SqlCtrls sql_ctrls;
	
//	EditInt nro_afiliado; 		// Número de Afiliado
//	EditInt beneficio; 			// Beneficio
//	EditInt ley; 				// Ley
//	EditInt sub; 				// Sub
//	EditInt cod_dcto; 			// Código de Descuento
//	EditString dni; 			// Documento del afiliado
//	EditInt nro_socio; 			// Número de Socio del Afiliado
//	EditString apellido_nombre; // Nombre y Apellido del Afiliado
//	EditString observaciones; 	// Observaciones
//	EditString descuento; 		// Descuento
	
	void MenuPrincipal(Bar& bar);
	void MenuArchivo(Bar& bar);
	void MenuAfiliado(Bar& bar);
	void MenuOpciones(Bar& bar);
	
	void Exit();
	void ModificarAfiliado();
	
	void HabilitarValorBusqueda();
	void FiltrarValor();
	void HabilitarEdicionAfiliado();
	
	void VerAltasMes();
	void VerBajasMes();
	
	void CargarArchivExcel();
	void LeerArchivoExcel(String archivo);
	void ParsearAfiliadosExcel(String linea);
	void InsertarAfiliadosNuevos();
	
	void IrAdherentes();
	void IrSolicitudes();
	
	void GenerarCarnet();
	void ConfigurarImpresion();
	void Ayuda();
	
public:
	ListadoAfiliadosDlg();
	void EliminarAfiliado();
};

//==============================================================================================
class ListadoAfiliadosAdherentesDlg : public WithListadoAfiliadosAdherentes<TopWindow> {
	typedef ListadoAfiliadosAdherentesDlg CLASSNAME;
	
	void HabilitarValorBusqueda();
	void FiltrarValor();
	void HabilitarEdicionAfiliado();
	void ModificarAfiliado();	

	void GenerarCarnet();
	void ConfigurarPadron();
	
	void IrActivos();
	void IrSolicitudes();

public:
	ListadoAfiliadosAdherentesDlg();
	void EliminarAfiliado();
};

//==============================================================================================

/**
 Formulario para ver y/o editar los datos de un afiliado.
*/
class VerModificarAfiliadoDlg : public WithVerModificarAfiliadoLayout<TopWindow> {
	typedef VerModificarAfiliadoDlg CLASSNAME;
	
	SqlCtrls sql_ctrls, sql_ctrls2;
	SqlArray * lista_padre;
	int nro_soc_seleccionado;
	
	void EditarDatosAfiliado();
	void HabilitarCtrls();
	void DeshabilitarCtrls();
	bool esLetra(int caracter);
	bool NombreyApellidoValido(String nombre);
	bool DocumentoValido(String dni);
	bool EmailValido(String email);
	bool ValidarTelefono(String telefono_);
	void GuardarModificacion();

public:
	VerModificarAfiliadoDlg();
	void VerDatosAfiliado(int nro_soc);
	void SetListaPrincipal(SqlArray& padre) { lista_padre = &padre; }
};

//==============================================================================================

/**
 Formulario para ver y/o editar los datos de un afiliado adherente.
*/
class VerModificarAfiliadoADDlg : public WithVerModificarAfiliadoLayout<TopWindow> {
	typedef VerModificarAfiliadoADDlg CLASSNAME;
	
	SqlCtrls sql_ctrls, sql_ctrls2;
	SqlArray * lista_padre;
	int nro_soc_seleccionado;
	
	void EditarDatosAfiliado();
	void HabilitarCtrls();
	void DeshabilitarCtrls();
	bool esLetra(int caracter);
	bool NombreyApellidoValido(String nombre);
	bool DocumentoValido(String dni);
	bool EmailValido(String email);
	bool ValidarTelefono(String telefono_);
	void GuardarModificacion();

public:
	VerModificarAfiliadoADDlg();
	void VerDatosAfiliado(int nro_soc);
	void SetListaPrincipal(SqlArray& padre) { lista_padre = &padre; }
};

//==============================================================================================

/**
 Ventana que muestra el listado de potenciales afiliados.
*/
class ListadoSolicitudesDlg : public WithListadoAfiliadosPotencialesLayout<TopWindow> {
	typedef ListadoSolicitudesDlg CLASSNAME;
	
	MenuBar menu;
	ToolBar tool;
	StatusBar status;
	
	void MenuPrincipal(Bar& bar);
	void MenuArchivo(Bar& bar);
	void MenuSolicitud(Bar& bar);
	void MenuVer(Bar& bar);
	
	void AgregarAfiliado();
	void ModificarAfiliado();
	void EliminarAfiliado();
	
	void RegistrarSocio();
	void RechazarSocio();
	
	void SolicitudesRechazadas();
	void GenerarComprobante();
	
	void IrActivos();
	void IrAdherentes();
	
	void Salir();
	void Ayuda();

public:
	ListadoSolicitudesDlg();
};

//==============================================================================================

/**
 Ventana para generar un solicitud de nuevo socio.
*/
class AltaSolicitudSocio : public WithFormularioAltaPotencialAfiliadoLayout<TopWindow> {
	typedef AltaSolicitudSocio CLASSNAME;
	
	SqlCtrls sql_ctrls;
	SqlArray * lista_padre;
	
	bool EmailValido(String email);
	bool ValidarTelefono(String telefono_);
	bool esLetra(int c);
	bool DocumentoValido(String dni);
	bool NombreyApellidoValido(String nombre);
	
	void InsertarSolicitud();
	void GenerarComprobante(String dni_);
public:
	AltaSolicitudSocio();
	void SetListaPrincipal(SqlArray& padre) { lista_padre = &padre; }
};

//==============================================================================================

/**
 Ventana paa editar la solicitud de nuevo socio.
*/
class ModificarSolicitudSocio : public WithFormularioModificacionAfiliadoLayout<TopWindow> {
	typedef ModificarSolicitudSocio CLASSNAME;
	
	SqlCtrls sql_ctrls;
	SqlArray * lista_padre;
	String dni_seleccionado;
	
	bool esLetra(int c);
	bool NombreyApellidoValido(String nombre);
	bool DocumentoValido(String dni);
	bool EmailValido(String email);
	bool ValidarTelefono(String telefono_);
	void GuardarModificacion();

public:
	ModificarSolicitudSocio();
	void EditandoAfiliado(String dni_);
	void SetListaPrincipal(SqlArray& padre) { lista_padre = &padre; }
};

//==============================================================================================

/**
 Permite dar de alta un socio al que se le ha aceptado la solicitud.
*/
class RegistroSocioDlg : public WithRegistroSocioLayout<TopWindow> {
	typedef RegistroSocioDlg CLASSNAME;

	SqlArray * lista_padre;
	String dni_seleccionado;
	
	void AprobarSolicitud();

public:
	RegistroSocioDlg();
	void SetListaPrincipal(SqlArray& padre) { lista_padre = &padre; }
	void RegistrandoSocio(String dni);
};

//==============================================================================================

class ListadoSolicitudesRechazadasDlg : public WithListadoSolicitudesRechazadasLayout<TopWindow> {
	typedef ListadoSolicitudesRechazadasDlg CLASSNAME;
	
	SqlArray * lista_padre;
	Label * lab_cant_solic;

	void LimpiarRegistros();
	void MostrarEntreFechas();
	void Actualizar();
	void ReadmitirSocio();

public:
	ListadoSolicitudesRechazadasDlg();
	
	void SetListaSolicitudes(SqlArray& padre) { lista_padre = &padre; }
	void SetLabel(Label& label_) { lab_cant_solic = & label_; }
};

//==============================================================================================

/**
 Ventana que muestra los afiliados que se han dado de alta en el mes.
*/
class AltasAfiliadosMes : public WithAltasAfiliadosMesLayout<TopWindow> {
	typedef AltasAfiliadosMes CLASSNAME;
	
	EditInt nro_afiliado;
	EditString dni, apynom;
	
	void ExportarAltas();
	void QuitarAfiliado();
	void LimpiarLista();
	void HabilitarBotones();
	void Salir();
	
public:
	AltasAfiliadosMes();
};

//==============================================================================================

/**
 Ventana que muestra los afiliados que se han dado de baja en el mes.
*/
class BajaAfiliadoMes : public WithBajaAfiliadosMesLayout<TopWindow> {
	typedef BajaAfiliadoMes CLASSNAME;
	
	EditInt nro_afiliado;
	EditString dni, apynom;
	
	void ExportarBajas();
	void QuitarAfiliado();
	void EnableExportarBtn();
	void EnableQuitarBtn();
	void LimpiarLista();
	void HabilitarBotones();
	void Salir();
	
public:
	BajaAfiliadoMes();
};

//==============================================================================================

/**
*/
class ConfigurarCarnetDlg : public WithConfigurarCarnetLayout<TopWindow> {
	typedef ConfigurarCarnetDlg CLASSNAME;
	
	String qtf;
	void GenerarReporte();
	void ExportarAPdf();
	
public:
	ConfigurarCarnetDlg();
	
	void ConfigurandoCarnet(int nro_socio_);
};

//==============================================================================================

/**
*/
class ConfigurarFormularioSolicitud {
	typedef ConfigurarFormularioSolicitud CLASSNAME;
	
public:
	ConfigurarFormularioSolicitud(String dni_);
};

//==============================================================================================

/**
*/
class ConfigurarPadronDlg : public WithConfigurarImpresionLayout<TopWindow> {
	typedef ConfigurarPadronDlg CLASSNAME;
	
	void HabilitarOrdenamiento();
	void OrdenAscendente();
	void OrdenDescendente();
	void GenerarReporte();
	
	void ImpresionMenu(Bar& bar);
	void MostrarColumna(int index, bool visible);

public:
	ConfigurarPadronDlg(int tipo_socio_);
};

#endif